-- -*- coding: utf-8 -*-
-- 工具函数模块
-- 包含游戏中所有的辅助工具函数

local const = require("api.const")

local tool = {}

function tool.calculate_distance(pos1, pos2)
    -- 计算两点之间的曼哈顿距离
    -- Args:
    --     pos1: 位置1 {x, y}
    --     pos2: 位置2 {x, y}
    -- Returns:
    --     曼哈顿距离
    return math.abs(pos1.x - pos2.x) + math.abs(pos1.y - pos2.y)
end

function tool.calculate_legal_distance(pos1, pos2)
    -- 计算两点之间的合法距离（只允许水平或垂直移动）
    -- Args:
    --     pos1: 位置1 {x, y}
    --     pos2: 位置2 {x, y}
    -- Returns:
    --     合法距离，如果不能直接到达则返回-1
    local dx = math.abs(pos2.x - pos1.x)
    local dy = math.abs(pos2.y - pos1.y)

    -- 只允许水平或垂直方向，不允许对角线
    if dx > 0 and dy > 0 then
        return -1 -- 不能直接到达
    end

    -- 返回水平或垂直距离
    return math.max(dx, dy)
end

function tool.is_in_range(from_pos, to_pos, range_val)
    -- 检查位置是否在范围内（只允许水平或垂直方向，不允许对角线）
    -- Args:
    --     from_pos: 起始位置 {x, y}
    --     to_pos: 目标位置 {x, y}
    --     range_val: 范围
    -- Returns:
    --     是否在范围内
    local legal_distance = tool.calculate_legal_distance(from_pos, to_pos)
    return legal_distance ~= -1 and legal_distance <= range_val
end

function tool.get_direction_to(from_pos, to_pos)
    -- 获取从起点到终点的方向
    -- Args:
    --     from_pos: 起始位置 {x, y}
    --     to_pos: 目标位置 {x, y}
    -- Returns:
    --     方向向量 {x, y}
    local dx = to_pos.x - from_pos.x
    local dy = to_pos.y - from_pos.y

    if math.abs(dx) > math.abs(dy) then
        return { x = dx > 0 and 1 or -1, y = 0 }
    else
        return { x = 0, y = dy > 0 and 1 or -1 }
    end
end

function tool.is_valid_position(input, pos)
    -- 检查位置是否有效
    -- Args:
    --     input: 游戏状态
    --     pos: 位置 {x, y}
    -- Returns:
    --     位置是否有效
    return pos.x >= 1 and pos.x <= input.battleState.width and
        pos.y >= 1 and pos.y <= input.battleState.height
end

function tool.get_position_state(input, pos)
    -- 获取位置状态
    -- Args:
    --     input: 游戏状态
    --     pos: 位置 {x, y}
    -- Returns:
    --     位置状态: 'invalid'|'block'|'unit'|'building'|'empty'

    if not tool.is_valid_position(input, pos) then
        return 'invalid'
    end

    -- 检查地形是否可移动：只有平地可以移动，河流和其他地形都阻隔移动
    local tile = input:getTilde(pos.x, pos.y)
    if not tile or tile.type ~= const.TildeType.flat then
        return 'block' -- 河流、山丘、资源地形等都阻隔移动
    end

    -- 检查是否有存活的单位
    for _, unit in pairs(input.units) do
        if unit.hp > 0 and unit.x == pos.x and unit.y == pos.y then
            return 'unit'
        end
    end

    -- 检查是否有存活的建筑
    for _, building in pairs(input.buildings) do
        if building.hp > 0 and building.x == pos.x and building.y == pos.y then
            return 'building'
        end
    end

    return 'empty'
end

return tool
